<!DOCTYPE html>
<html lang="cn" dir="auto">

<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>Windows 激活——MAS | 染竹君的个人博客</title>
<meta name="keywords" content="Windows 激活">
<meta name="description" content="Windows MAS（Microsoft Activation Scripts）激活脚本介绍及使用，支持 Win10、11。">
<meta name="author" content="SadBird">
<link rel="canonical" href="https://www.liyangjie.cn/posts/hobby/windows-activation/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.min.4b7d810bc0c98044b1c7a72962d55d7f125a07c3ed5cf31e670c3fdecc98b341.css" integrity="sha256-S32BC8DJgESxx6cpYtVdfxJaB8PtXPMeZww/3syYs0E=" rel="preload stylesheet" as="style">
<link rel="icon" href="https://www.liyangjie.cn/favicon/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://www.liyangjie.cn/favicon/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://www.liyangjie.cn/favicon/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://www.liyangjie.cn/favicon/apple-touch-icon.png">
<link rel="mask-icon" href="https://www.liyangjie.cn/favicon/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<noscript>
    <style>
        #theme-toggle,
        .top-link {
            display: none;
        }

    </style>
    <style>
        @media (prefers-color-scheme: dark) {
            :root {
                --theme: rgb(29, 30, 32);
                --entry: rgb(46, 46, 51);
                --primary: rgb(218, 218, 219);
                --secondary: rgb(155, 156, 157);
                --tertiary: rgb(65, 66, 68);
                --content: rgb(196, 196, 197);
                --hljs-bg: rgb(46, 46, 51);
                --code-bg: rgb(55, 56, 62);
                --border: rgb(51, 51, 51);
            }

            .list {
                background: var(--theme);
            }

            .list:not(.dark)::-webkit-scrollbar-track {
                background: 0 0;
            }

            .list:not(.dark)::-webkit-scrollbar-thumb {
                border-color: var(--theme);
            }
        }

    </style>
</noscript>
<meta name="baidu-site-verification" content="code-9oLyeix0aK" />
<script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?4a41bf85d719f0e8c3165fc76904f546";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
</script>


<script async src="https://www.googletagmanager.com/gtag/js?id=G-C6GDZ56F4S"></script>
<script>
var doNotTrack = false;
if (!doNotTrack) {
	window.dataLayer = window.dataLayer || [];
	function gtag(){dataLayer.push(arguments);}
	gtag('js', new Date());
	gtag('config', 'G-C6GDZ56F4S', { 'anonymize_ip': false });
}
</script>
<meta property="og:title" content="Windows 激活——MAS" />
<meta property="og:description" content="Windows MAS（Microsoft Activation Scripts）激活脚本介绍及使用，支持 Win10、11。" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://www.liyangjie.cn/posts/hobby/windows-activation/" />
<meta property="og:image" content="https://i.loli.net/2021/10/24/cHZTUwjKkP2xbJq.png" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2021-10-23T16:41:53&#43;08:00" />
<meta property="article:modified_time" content="2021-10-23T16:41:53&#43;08:00" />

<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://i.loli.net/2021/10/24/cHZTUwjKkP2xbJq.png" />
<meta name="twitter:title" content="Windows 激活——MAS"/>
<meta name="twitter:description" content="Windows MAS（Microsoft Activation Scripts）激活脚本介绍及使用，支持 Win10、11。"/>


<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position":  1 ,
      "name": "Posts",
      "item": "https://www.liyangjie.cn/posts/"
    }, 
    {
      "@type": "ListItem",
      "position":  2 ,
      "name": "Hobby",
      "item": "https://www.liyangjie.cn/posts/hobby/"
    }, 
    {
      "@type": "ListItem",
      "position":  3 ,
      "name": "Windows 激活——MAS",
      "item": "https://www.liyangjie.cn/posts/hobby/windows-activation/"
    }
  ]
}
</script>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Windows 激活——MAS",
  "name": "Windows 激活——MAS",
  "description": "Windows MAS（Microsoft Activation Scripts）激活脚本介绍及使用，支持 Win10、11。",
  "keywords": [
    "Windows 激活"
  ],
  "articleBody": "MAS 时至今日，仍然有很多朋友对 Windows 的激活束手无策，百度搜索出来的解决方案也是五花八门，甚至有些是恶意病毒，这更让「白嫖」的小白用户痛不欲生。\n为了解决激活问题，本文推荐一个安全、便捷的 Windows 激活脚本开源项目：Microsoft Activation Scripts。\nMicrosoft Activation Scripts\r\rA collection of scripts for activating Microsoft products using HWID / KMS38 / Online KMS activation methods with a focus on open-source code, less antivirus detection and user-friendliness.\r\r 简单来说，Microsoft Activation Scripts 是一款安全开源的 Windows 产品激活工具，提供了多种激活方法和友好的用户交互界面。\n 下载使用 官方提供了 GitHub 和 GitLab 两个下载地址，请自行选择。此处以 GitHUB 为例进行介绍：\n\r\r下载后，使用图中所示解压密码进行解压，得到 MAS_1.5 目录。目录结构如下：\n1 2 3  MAS_1.5 ├─ All-In-One-Version └─ Separate-Files-Version   其中，All-In-One-Version 目录中为集成脚本，提供了所有激活方法的快捷操作入口。而 Separate-Files-Version 为具体的各个激活方法的独立脚本，用户可以根据需要自行选择执行。剩余 ReadMe.html 为说明文档，Verify_Files-Clear_Zone.Identifier-68.cmd 校验文件并对时区进行清理，防止 SmartScreen 警告。\n作为小白用户，这里当然推荐直接使用集成脚本，进入 All-In-One-Version 目录，直接双击执行该目录下的执行脚本（这里 1.5 版本为 MAS_1.5_AIO_CRC32_21D20776.cmd），界面如下：\n\r\r根据提示的选项，输入具体的数字进行进行激活即可：\n 1：HWID 激活（永久，支持 Win 10-11）。 2：KMS38 激活（有效期至 2038年，适用于 Win10-11-Server）。 3：Online KMS 激活（有效期 180 天，支持 Win7 以上和 Office）。 4：查看当前激活状态（vbs）。 5：查看当前激活状态（wmi）。 6：其他功能选项（如预激活镜像制作等）。 7：说明文档，详细介绍了每种激活方法支持的 Windows 产品，使用方法等。 8：退出。  当然，最重要的就是其中的 1-3 这三个选项了，分别使用 3 种不同的方式进行激活。对于 Win10、11，这里推荐使用 1：HWID 进行激活，而对于 Win7 只能选择 3：Online KMS 进行激活，3：Online KMS 同样支持 Office 的激活，但不推荐使用。对于 Office 这里推荐一个从安装到激活的 Office 一站式部署工具 Office Tool Plus。\n这里以 1: HWID 为例进行演示：\n 首先在主界面输入 1，即可进入 HWID 激活界面： \r\r 在上述界面中，再次输入 1，开始进行 Windows 激活，完成后，如下图所示： \r\r  激活成功后，使用如下命令查看激活状态：\n1  slmgr.vbs -xpr   结果如下：\n\r\r 激活方法说明 以下内容均来自 MAS 项目的说明文档，对三种激活方式进行了简要的说明。在原文中也有说明许多内容只是猜测，此处仅供参考。\nHWID 使用该方法进行激活要满足以下几个条件：\n 仅支持 Win10 及 Win11。 机器处于联网状态。 Windows Update Service（就是我们经常抱怨的 Windows 自动更新服务） 处于 Automatic 状态。  当 Windows 版本从 Win7、Win8 或者 Win8.1 升级到 Win10（包括低版本 Win10 升级到更高版本的 Win10）时，已经激活的系统会自动获得一个数字许可（Digital License），该许可将会和用户永久绑定（通过用户的硬件或者用户的 Microsoft 账号），亦即我们所谓的「永久激活」。\n这种方法的内部工作流程大致如下：\n升级进程执行位于升级镜像中的 gatherosstate.exe 程序，该程序为后续流程生成一个 Genuine Ticket，该 ticket 是一个 xml 格式的文件，包含了以下内容：\nGenuineAuthorization XML\r\r Its version. As of now, this is always “1.0”. genuineProperties:  Properties:  OA3xOriginalProductId - The Product ID of the BIOS key. OA3xOriginalProductKey - The BIOS product key. SessionId:  OSMajorVersion - The OS Version Major OSMinorVersion - The OS Version Minor OSPlatformId - The OS Platform ID. Always 2 (2 means Windows NT) PP - Protected Process - Whether or not gatherosstate was run as a protected process (It practically never does. ClipUp is also capable of generating those tickets, and it runs as a protected process.) Hwid - The Hardware Id - a base64-encoded byte array containing information about the current hardware configuration. Pfn - Package Family Name - The package family name of your Windows edition. OA3xOriginalProductKey - The BIOS product key. (Yes, it’s a duplicate). DownlevelGenuineState - Indicates whether or not your system is genuine. (activated)   TimeStampClient - The ISO 8601 format date of ticket generation.   Signatures:  signature: (Either downlevelGTkey or clientLockboxKey depending on which utility actually generated the ticket - SLC, gatherosstate or ClipUp.)  downlevelGTkey - rsa-sha256 signature for the Properties field. clientLockboxKey - rsa-sha256 signature for the Properties field.        \r\r Client License Platform（ClipUp）程序会将上述 ticket 提交给微软服务器，并返回一个代表数字许可的 JSON。\n该数字许可最终会绑定到用户当前的硬件上，若硬件进行了更换，则会通过 Microsoft 账号将数字许可迁移到新硬件上。\n基于上述流程，两位大佬找到了一种手动生成 ticket 并交付给 gatherosstate.exe 进行数字许可申请的快速手段。\ngatherosstate.exe 在执行过程中会加载 SLC（Software Licensing Client）动态库以获取当前机器的原许可信息，且 gatherosstate.exe 不会对该许可信息进行额外的检查认证，直接将这些信息封装入 ticket，提交到微软服务器。这里最关键的步骤就是 SLC 的动态替换，直接将合法的伪装 SLC 放置到 gatherosstate.exe 相同目录下，这时 gatherosstate.exe 就会使用该合法的伪装 SLC 进行数字许可申请，最终完成系统的激活。\n最后，还有一个大家关心的问题：\nFAQ\r\r微软能不能区分这些通过非正常方法获取的数字许可，并将它们回收或者禁用？\n制作该工具的大佬也给出了他的解答：\nUmm.. Yes, but actully no.\n可以区分，但是实际上不会封禁。\n微软在 ticket 中对于原先未激活的系统会设置 downlevelGTkey 标识，而正常激活过的系统会设置为 clientLockboxKey 标识。通过 MAS 工具进行申请时，我们伪装成了已经正常激活的系统，因此 ticket 中的标识为 clientLockboxKey。如果进行大面积的封禁，存在误封的风险。\n最重要的一点，微软不在意个人消费者的盗版行为，因为这不是它主要的收入来源。\n\r\r KMS38 这种方法与 HWID 方法流程基本一致，使用的工具一模一样，只是在 KMS38 ticket 中的时间字段。HWID 中使用的是 Pfn 字段，而在 KMS38 中使用的是 GVLKExp，它是 Generic Volume Key Expiration （date）的简写，是一个 ISO8601 标准的时间戳，表示 KMS 激活的到期时间（到2038年）。KMS38 最终并不会将 ticket 发送到微软服务器进行认证，而是发送到 KMS 服务器，MAS 提供了一个本地执行的服务器进行该认证操作。\nKMS38 使用注意事项：\n 激活前，确保当前系统中不存在任何其他的 KMS 激活服务正在运行，若有则需要先卸载。 激活完成后，如果要使用 KMS 进行 Windows 其他产品的激活（如 Office），需要确保这些 KMS 能够兼容 KMS38，即不覆盖我们已经完成的 KMS38 激活（如果不能保证兼容，则需要执行 MAS 中的 KMS38 保护机制：进入主界面的 6 选项，选择 [4] Protect / Unprotect KMS38 Activation）。 这种方法生成的 ticket 仅适用于 Volume:GVLK 的系统，即 Enterprise 和 Education 版本。  Online KMS KMS（Key Management Service）是微软官方为政府、学校或公司等组织提供的一种批量授权手段，在组织中的机器（KMS Client）可以向组织内的 KMS Host Server 申请许可，而不是微软的授权服务器。这种方式的特点是：每次申请的许可最长过期时间为 180 天，且每隔 7 天，KMS Client 都会向 KMS Host Server 发起许可更新请求。\n市面上许多的 KMS 激活工具都是在机器本地创建一个 KMS HOST Server，为自己本机提供激活服务，因此这些工具都需要在机器本地执行一个后台程序，从而导致一些病毒检测程序误杀误报。\n同时，世界上还存在许多公用的 KMS Host Server，我们的 KMS Client 仅需要提供本机的一些信息（不敏感）给这些公用 Server，它们就会提供激活功能。这也是 Online KMS 使用的方法。它使用了一些常用的公共 Server，且保证了和 KMS38 方法的兼容性。\n 制作预激活镜像 平时我们对于系统的安装和激活总是先使用纯净镜像进行安装，安装完成进入系统后再手动执行激活操作。MAS 提供了一个预激活（Windows Pre-Activation）的方法，能够在系统安装完成的同时自动执行激活操作。\n操作流程也非常简单，同样打开 All-In-One-Version 目录中的 cmd 脚本，选择 6 进入其他功能选项菜单，再选择 [2] Extract $OEM$ Folder 即可进入到预激活文件选择界面，如下图所示：\n\r\r这里我们选择 [4] HWID  KMS38，它表示预激活先使用 HWID 方法，若激活失败，则降级到使用 KMS38（至于再次降级使用 Online KMS，个人认为没有必要），此时程序会在桌面上创建一个 $OEM$ 目录，里面就包含了预激活脚本。\n准备好 Windows ISO 纯净镜像，这里以 Win11 为例，打开 官网，按照下图所示即可完成下载：\n\r\r使用 UltraISO、AnyBurn 等刻录工具打开你下载好的纯净 Windows ISO 镜像文件，将上述目录拷贝到镜像下的 \\sources 目录，此时应该存在目录 \\sources\\$OEM$，记得保存，如下图所示：\n\r\r至此，我们完成了预激活镜像的制作。\n我在虚拟机进行了测试，使用刚制作好的预激活镜像进行系统安装（Win11 的安装需要联网并且登录微软账号），安装成功后，系统已是激活状态：\n\r\r 安全 MAS 提供了一份项目中使用到的所有不可读文件的病毒检测报告（检测平台：Virus Total）：\nVirus Total Report\r\r1 2 3 4  fabb5a0fc1e6a372219711152291339af36ed0b5 *gatherosstate.exe Virus Total = 0/71 ca3a51fdfc8749b8be85f7904b1c238a6dfba135 *slc.dll Virus Total = 0/68 578364cb2319da7999acd8c015b4ce8da8f1b282 *ARM64_gatherosstate.exe Virus Total = 0/69 5dbea3a580cf60391453a04a5c910a3ceca2b810 *ARM64_slc.dll Virus Total = 0/67   以下 exe 均为 Microsoft 官方提供的文件，因此即使检测报告数量不为 0，也并不用担心安全问题：\n1 2 3 4  48d928b1bec25a56fe896c430c2c034b7866aa7a *ClipUp.exe Virus Total = 0/68 d30a0e4e5911d3ca705617d17225372731c770e2 *cleanosppx64.exe Virus Total = 0/66 39ed8659e7ca16aaccb86def94ce6cec4c847dd6 *cleanosppx86.exe Virus Total = 1/66 9d5b4b3e761cca9531d64200dfbbfa0dec94f5b0 *_Info.txt Virus Total = 0/59   \r\r  总结  如果是最常用的个人电脑，推荐直接使用 HWID 方法，保证联网和 Windows Update Service 正常运行这两个条件即可。 如果是一些特殊版本（如 Server、Enterprise等），则可以使用 KMS38。 如果要激活 Office，可以使用 Online KMS。  ",
  "wordCount" : "663",
  "inLanguage": "cn",
  "image":"https://i.loli.net/2021/10/24/cHZTUwjKkP2xbJq.png","datePublished": "2021-10-23T16:41:53+08:00",
  "dateModified": "2021-10-23T16:41:53+08:00",
  "author":[{
    "@type": "Person",
    "name": "SadBird"
  }],
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://www.liyangjie.cn/posts/hobby/windows-activation/"
  },
  "publisher": {
    "@type": "Organization",
    "name": "染竹君的个人博客",
    "logo": {
      "@type": "ImageObject",
      "url": "https://www.liyangjie.cn/favicon/favicon.ico"
    }
  }
}
</script>
</head>

<body class="">
    <a id="top"></a>
<script>
    if (localStorage.getItem("pref-theme") === "dark") {
        document.body.classList.add('dark');
    } else if (localStorage.getItem("pref-theme") === "light") {
        document.body.classList.remove('dark')
    } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
        document.body.classList.add('dark');
    }

</script>

<header class="header">
    <nav class="nav">
        <div class="logo">
            <a href="https://www.liyangjie.cn/" accesskey="h" title="染竹君的小站 (Alt + H)">
                        
                    <img src="https://www.liyangjie.cn/img/logo_hue7837a3d2f79ccdd94da0537755daebc_15738_0x30_resize_box_3.png" alt="logo" aria-label="logo"
                        height="30">染竹君的小站</a>
            <span class="logo-switches">
                <button id="theme-toggle" accesskey="t" title="(Alt + T)">
                    <svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
                        stroke-linejoin="round">
                        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
                    </svg>
                    <svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
                        stroke-linejoin="round">
                        <circle cx="12" cy="12" r="5"></circle>
                        <line x1="12" y1="1" x2="12" y2="3"></line>
                        <line x1="12" y1="21" x2="12" y2="23"></line>
                        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
                        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
                        <line x1="1" y1="12" x2="3" y2="12"></line>
                        <line x1="21" y1="12" x2="23" y2="12"></line>
                        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
                        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
                    </svg>
                </button>
            </span>
        </div>
        <ul id="menu">
            <li>
                <a href="https://www.liyangjie.cn/categories/" title="分类">
                    <span>分类</span>
                </a>
            </li>
            <li>
                <a href="https://www.liyangjie.cn/tags/" title="标签">
                    <span>标签</span>
                </a>
            </li>
            <li>
                <a href="https://www.liyangjie.cn/archives/" title="归档">
                    <span>归档</span>
                </a>
            </li>
            <li>
                <a href="https://www.liyangjie.cn/search/" title="搜索">
                    <span>搜索</span>
                </a>
            </li>
        </ul>
    </nav>
</header>
<main class="main">

<article class="post-single">
  <header class="post-header">
    <div class="breadcrumbs"><a href="https://www.liyangjie.cn/">Home</a>&nbsp;»&nbsp;<a href="https://www.liyangjie.cn/posts/">Posts</a>&nbsp;»&nbsp;<a href="https://www.liyangjie.cn/posts/hobby/">Hobby</a></div>
    <h1 class="post-title">
      Windows 激活——MAS
    </h1>
    <div class="post-meta"><span title='2021-10-23 16:41:53 +0800 CST'>October 23, 2021</span>&nbsp;·&nbsp;4 min&nbsp;·&nbsp;SadBird&nbsp;|&nbsp;<a href="https://github.com/YazidLee/hugo-backup/tree/master/content/posts/hobby/Windows%e6%bf%80%e6%b4%bb--MSA.md" rel="noopener noreferrer" target="_blank">Suggest Changes</a>
</div>
  </header> <figure class="entry-cover"><img class="lazy" src="/svg/loading.min.svg"  data-src="https://i.loli.net/2021/10/24/cHZTUwjKkP2xbJq.png" loading="lazy" alt="">
        
</figure><div class="toc">
    <details >
        <summary accesskey="c" title="(Alt + C)">
            <span class="details">Table of Contents</span>
        </summary>

        <div class="inner"><ul>
                <li>
                    <a href="#mas" aria-label="MAS">MAS</a></li>
                <li>
                    <a href="#%e4%b8%8b%e8%bd%bd%e4%bd%bf%e7%94%a8" aria-label="下载使用">下载使用</a></li>
                <li>
                    <a href="#%e6%bf%80%e6%b4%bb%e6%96%b9%e6%b3%95%e8%af%b4%e6%98%8e" aria-label="激活方法说明">激活方法说明</a><ul>
                        
                <li>
                    <a href="#hwid" aria-label="HWID">HWID</a></li>
                <li>
                    <a href="#kms38" aria-label="KMS38">KMS38</a></li>
                <li>
                    <a href="#online-kms" aria-label="Online KMS">Online KMS</a></li></ul>
                </li>
                <li>
                    <a href="#%e5%88%b6%e4%bd%9c%e9%a2%84%e6%bf%80%e6%b4%bb%e9%95%9c%e5%83%8f" aria-label="制作预激活镜像">制作预激活镜像</a></li>
                <li>
                    <a href="#%e5%ae%89%e5%85%a8" aria-label="安全">安全</a></li>
                <li>
                    <a href="#%e6%80%bb%e7%bb%93" aria-label="总结">总结</a>
                </li>
            </ul>
        </div>
    </details>
</div>

  <div class="post-content"><h2 id="mas">MAS<a hidden class="anchor" aria-hidden="true" href="#mas">#</a></h2>
<p>时至今日，仍然有很多朋友对 Windows 的激活束手无策，百度搜索出来的解决方案也是五花八门，甚至有些是恶意病毒，这更让「白嫖」的小白用户痛不欲生。</p>
<p>为了解决激活问题，本文推荐一个安全、便捷的 Windows 激活脚本开源项目：<a href="https://windowsaddict.ml/">Microsoft Activation Scripts</a>。</p>
<div class="details admonition quote open">
        <div class="details-summary admonition-title">
            <i class="icon fas fa-quote-right fa-fw"></i>Microsoft Activation Scripts<i class="details-icon fas fa-angle-right fa-fw"></i>
        </div>
        <div class="details-content">
            <div class="admonition-content">A collection of scripts for activating Microsoft products using HWID / KMS38 / Online KMS activation methods with a focus on open-source code, less antivirus detection and user-friendliness.</div>
        </div>
    </div>
<p>简单来说，<em>Microsoft Activation Scripts</em> 是一款安全开源的 Windows 产品激活工具，提供了多种激活方法和友好的用户交互界面。</p>
<hr>
<h2 id="下载使用">下载使用<a hidden class="anchor" aria-hidden="true" href="#下载使用">#</a></h2>
<p>官方提供了 <a href="https://github.com/massgravel/Microsoft-Activation-Scripts/releases">GitHub</a> 和 <a href="https://gitlab.com/massgrave/microsoft-activation-scripts/-/releases">GitLab</a> 两个下载地址，请自行选择。此处以 GitHUB 为例进行介绍：</p>
<p><figure><a class="lightgallery" href="https://s2.loli.net/2022/01/26/fkRKWxLzOtmucZi.png" title="https://s2.loli.net/2022/01/26/fkRKWxLzOtmucZi.png" data-thumbnail="https://s2.loli.net/2022/01/26/fkRKWxLzOtmucZi.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://s2.loli.net/2022/01/26/fkRKWxLzOtmucZi.png"
            loading="lazy"
            title="https://s2.loli.net/2022/01/26/fkRKWxLzOtmucZi.png"
            alt="https://s2.loli.net/2022/01/26/fkRKWxLzOtmucZi.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<p>下载后，使用图中所示解压密码进行解压，得到 <code>MAS_1.5</code> 目录。目录结构如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">MAS_1.5
</span></span><span class="line"><span class="cl">├─ All-In-One-Version
</span></span><span class="line"><span class="cl">└─ Separate-Files-Version
</span></span></code></pre></td></tr></table>
</div>
</div><p>其中，<code>All-In-One-Version</code> 目录中为集成脚本，提供了所有激活方法的快捷操作入口。而 <code>Separate-Files-Version</code> 为具体的各个激活方法的独立脚本，用户可以根据需要自行选择执行。剩余 <code>ReadMe.html</code> 为说明文档，<code>Verify_Files-Clear_Zone.Identifier-68.cmd</code> 校验文件并对时区进行清理，防止 SmartScreen 警告。</p>
<p>作为小白用户，这里当然推荐直接使用集成脚本，进入 <code>All-In-One-Version</code> 目录，直接双击执行该目录下的执行脚本（这里 1.5 版本为 <code>MAS_1.5_AIO_CRC32_21D20776.cmd</code>），界面如下：</p>
<p><figure><a class="lightgallery" href="https://s2.loli.net/2022/01/26/9mnQ8btSqkldiZM.png" title="https://s2.loli.net/2022/01/26/9mnQ8btSqkldiZM.png" data-thumbnail="https://s2.loli.net/2022/01/26/9mnQ8btSqkldiZM.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://s2.loli.net/2022/01/26/9mnQ8btSqkldiZM.png"
            loading="lazy"
            title="https://s2.loli.net/2022/01/26/9mnQ8btSqkldiZM.png"
            alt="https://s2.loli.net/2022/01/26/9mnQ8btSqkldiZM.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<p>根据提示的选项，输入具体的数字进行进行激活即可：</p>
<ul>
<li><code>1</code>：HWID 激活（永久，支持 Win 10-11）。</li>
<li><code>2</code>：KMS38 激活（有效期至 2038年，适用于 Win10-11-Server）。</li>
<li><code>3</code>：Online KMS 激活（有效期 180 天，支持 Win7 以上和 Office）。</li>
<li><code>4</code>：查看当前激活状态（vbs）。</li>
<li><code>5</code>：查看当前激活状态（wmi）。</li>
<li><code>6</code>：其他功能选项（如预激活镜像制作等）。</li>
<li><code>7</code>：说明文档，详细介绍了每种激活方法支持的 Windows 产品，使用方法等。</li>
<li><code>8</code>：退出。</li>
</ul>
<p>当然，最重要的就是其中的 <code>1-3</code> 这三个选项了，分别使用 3 种不同的方式进行激活。对于 Win10、11，这里推荐使用 <code>1：HWID</code> 进行激活，而对于 Win7 只能选择 <code>3：Online KMS</code> 进行激活，<code>3：Online KMS</code> 同样支持 Office 的激活，但不推荐使用。对于 Office 这里推荐一个从安装到激活的 Office 一站式部署工具 <a href="https://otp.landian.vip/">Office Tool Plus</a>。</p>
<p>这里以 <code>1: HWID</code> 为例进行演示：</p>
<ul>
<li>首先在主界面输入 <code>1</code>，即可进入 <code>HWID</code> 激活界面：
<figure><a class="lightgallery" href="https://s2.loli.net/2022/01/26/zju2QlJGIi3kKZ6.png" title="https://s2.loli.net/2022/01/26/zju2QlJGIi3kKZ6.png" data-thumbnail="https://s2.loli.net/2022/01/26/zju2QlJGIi3kKZ6.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://s2.loli.net/2022/01/26/zju2QlJGIi3kKZ6.png"
            loading="lazy"
            title="https://s2.loli.net/2022/01/26/zju2QlJGIi3kKZ6.png"
            alt="https://s2.loli.net/2022/01/26/zju2QlJGIi3kKZ6.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</li>
<li>在上述界面中，再次输入 <code>1</code>，开始进行 Windows 激活，完成后，如下图所示：
<figure><a class="lightgallery" href="https://s2.loli.net/2022/01/26/ByHvRPmzl2NJE9e.png" title="https://s2.loli.net/2022/01/26/ByHvRPmzl2NJE9e.png" data-thumbnail="https://s2.loli.net/2022/01/26/ByHvRPmzl2NJE9e.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://s2.loli.net/2022/01/26/ByHvRPmzl2NJE9e.png"
            loading="lazy"
            title="https://s2.loli.net/2022/01/26/ByHvRPmzl2NJE9e.png"
            alt="https://s2.loli.net/2022/01/26/ByHvRPmzl2NJE9e.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</li>
</ul>
<p>激活成功后，使用如下命令查看激活状态：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">slmgr.vbs -xpr
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果如下：</p>
<p><figure><a class="lightgallery" href="https://i.loli.net/2021/10/24/BsG2xfWUymK54LH.png" title="https://i.loli.net/2021/10/24/BsG2xfWUymK54LH.png" data-thumbnail="https://i.loli.net/2021/10/24/BsG2xfWUymK54LH.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://i.loli.net/2021/10/24/BsG2xfWUymK54LH.png"
            loading="lazy"
            title="https://i.loli.net/2021/10/24/BsG2xfWUymK54LH.png"
            alt="https://i.loli.net/2021/10/24/BsG2xfWUymK54LH.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<hr>
<h2 id="激活方法说明">激活方法说明<a hidden class="anchor" aria-hidden="true" href="#激活方法说明">#</a></h2>
<p>以下内容均来自 MAS 项目的说明文档，对三种激活方式进行了简要的说明。在原文中也有说明许多内容只是猜测，此处仅供参考。</p>
<h3 id="hwid">HWID<a hidden class="anchor" aria-hidden="true" href="#hwid">#</a></h3>
<p>使用该方法进行激活要满足以下几个条件：</p>
<ul>
<li>仅支持 Win10 及 Win11。</li>
<li>机器处于联网状态。</li>
<li>Windows Update Service（就是我们经常抱怨的 Windows 自动更新服务） 处于 Automatic 状态。</li>
</ul>
<p>当 Windows 版本从 Win7、Win8 或者 Win8.1 升级到 Win10（包括低版本 Win10 升级到更高版本的 Win10）时，已经激活的系统会自动获得一个数字许可（<em>Digital License</em>），该许可将会和用户<strong>永久</strong>绑定（通过用户的硬件或者用户的 Microsoft 账号），亦即我们所谓的「永久激活」。</p>
<p>这种方法的内部工作流程大致如下：</p>
<p>升级进程执行位于升级镜像中的 <code>gatherosstate.exe</code> 程序，该程序为后续流程生成一个 <code>Genuine Ticket</code>，该 ticket 是一个 xml 格式的文件，包含了以下内容：</p>
<div class="details admonition quote open">
        <div class="details-summary admonition-title">
            <i class="icon fas fa-quote-right fa-fw"></i>GenuineAuthorization XML<i class="details-icon fas fa-angle-right fa-fw"></i>
        </div>
        <div class="details-content">
            <div class="admonition-content"><ul>
<li>Its version. As of now, this is always &ldquo;1.0&rdquo;.</li>
<li>genuineProperties:
<ul>
<li>Properties:
<ul>
<li>OA3xOriginalProductId - The Product ID of the BIOS key.</li>
<li>OA3xOriginalProductKey - The BIOS product key.</li>
<li>SessionId:
<ul>
<li>OSMajorVersion - The OS Version Major</li>
<li>OSMinorVersion - The OS Version Minor</li>
<li>OSPlatformId - The OS Platform ID. Always 2 (2 means Windows NT)</li>
<li>PP - Protected Process - Whether or not gatherosstate was run as a protected process 
(It practically never does. ClipUp is also capable of generating those tickets, and it runs as a protected process.)</li>
<li>Hwid - The Hardware Id - a base64-encoded byte array containing information about the current hardware configuration.</li>
<li>Pfn - Package Family Name - The package family name of your Windows edition.</li>
<li>OA3xOriginalProductKey - The BIOS product key. (Yes, it&rsquo;s a duplicate).</li>
<li>DownlevelGenuineState - Indicates whether or not your system is genuine. (activated)</li>
</ul>
</li>
<li>TimeStampClient - The ISO 8601 format date of ticket generation.</li>
</ul>
</li>
<li>Signatures:
<ul>
<li>signature: (Either downlevelGTkey or clientLockboxKey depending on which utility actually generated the ticket - SLC, gatherosstate or ClipUp.)
<ul>
<li>downlevelGTkey - rsa-sha256 signature for the Properties field.</li>
<li>clientLockboxKey - rsa-sha256 signature for the Properties field.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
        </div>
    </div>
<p>Client License Platform（ClipUp）程序会将上述 ticket 提交给微软服务器，并返回一个代表数字许可的 JSON。</p>
<p>该数字许可最终会绑定到用户当前的硬件上，若硬件进行了更换，则会通过 Microsoft 账号将数字许可迁移到新硬件上。</p>
<p>基于上述流程，两位大佬找到了一种手动生成 ticket 并交付给 <code>gatherosstate.exe</code> 进行数字许可申请的快速手段。</p>
<p><code>gatherosstate.exe</code> 在执行过程中会加载 SLC（Software Licensing Client）动态库以获取当前机器的原许可信息，且 <code>gatherosstate.exe</code> 不会对该许可信息进行额外的检查认证，直接将这些信息封装入 ticket，提交到微软服务器。这里最关键的步骤就是 SLC 的动态替换，直接将合法的伪装 SLC 放置到 <code>gatherosstate.exe</code> 相同目录下，这时 <code>gatherosstate.exe</code> 就会使用该合法的伪装 SLC 进行数字许可申请，最终完成系统的激活。</p>
<p>最后，还有一个大家关心的问题：</p>
<div class="details admonition quote open">
        <div class="details-summary admonition-title">
            <i class="icon fas fa-quote-right fa-fw"></i>FAQ<i class="details-icon fas fa-angle-right fa-fw"></i>
        </div>
        <div class="details-content">
            <div class="admonition-content"><p>微软能不能区分这些通过非正常方法获取的数字许可，并将它们回收或者禁用？</p>
<p>制作该工具的大佬也给出了他的解答：</p>
<p>Umm.. Yes, but actully no.</p>
<p>可以区分，但是实际上不会封禁。</p>
<p>微软在 ticket 中对于原先未激活的系统会设置 downlevelGTkey 标识，而正常激活过的系统会设置为 clientLockboxKey 标识。通过 MAS 工具进行申请时，我们伪装成了已经正常激活的系统，因此 ticket 中的标识为 clientLockboxKey。如果进行大面积的封禁，存在误封的风险。</p>
<p><strong>最重要的一点，微软不在意个人消费者的盗版行为，因为这不是它主要的收入来源。</strong></p>
</div>
        </div>
    </div>
<h3 id="kms38">KMS38<a hidden class="anchor" aria-hidden="true" href="#kms38">#</a></h3>
<p>这种方法与 HWID 方法流程基本一致，使用的工具一模一样，只是在 KMS38 ticket 中的时间字段。HWID 中使用的是 <code>Pfn</code> 字段，而在 KMS38 中使用的是 <code>GVLKExp</code>，它是 Generic Volume Key Expiration （date）的简写，是一个 ISO8601 标准的时间戳，表示 KMS 激活的到期时间（到2038年）。KMS38 最终并不会将 ticket 发送到微软服务器进行认证，而是发送到 KMS 服务器，MAS 提供了一个本地执行的服务器进行该认证操作。</p>
<p>KMS38 使用注意事项：</p>
<ul>
<li>激活前，确保当前系统中不存在任何其他的 KMS 激活服务正在运行，若有则需要先卸载。</li>
<li>激活完成后，如果要使用 KMS 进行 Windows 其他产品的激活（如 Office），需要确保这些 KMS 能够兼容 KMS38，即不覆盖我们已经完成的 KMS38 激活（如果不能保证兼容，则需要执行 MAS 中的 KMS38 保护机制：进入主界面的 <code>6</code> 选项，选择 <code>[4] Protect / Unprotect KMS38 Activation</code>）。</li>
<li>这种方法生成的 ticket 仅适用于 Volume:GVLK 的系统，即 Enterprise 和 Education 版本。</li>
</ul>
<h3 id="online-kms">Online KMS<a hidden class="anchor" aria-hidden="true" href="#online-kms">#</a></h3>
<p>KMS（Key Management Service）是微软官方为政府、学校或公司等组织提供的一种批量授权手段，在组织中的机器（KMS Client）可以向组织内的 KMS Host Server 申请许可，而不是微软的授权服务器。这种方式的特点是：每次申请的许可最长过期时间为 180 天，且每隔 7 天，KMS Client 都会向 KMS Host Server 发起许可更新请求。</p>
<p>市面上许多的 KMS 激活工具都是在机器本地创建一个 KMS HOST Server，为自己本机提供激活服务，因此这些工具都需要在机器本地执行一个后台程序，从而导致一些病毒检测程序误杀误报。</p>
<p>同时，世界上还存在许多公用的 KMS Host Server，我们的 KMS Client 仅需要提供本机的一些信息（不敏感）给这些公用 Server，它们就会提供激活功能。这也是 Online KMS 使用的方法。它使用了一些常用的公共 Server，且保证了和 KMS38 方法的兼容性。</p>
<hr>
<h2 id="制作预激活镜像">制作预激活镜像<a hidden class="anchor" aria-hidden="true" href="#制作预激活镜像">#</a></h2>
<p>平时我们对于系统的安装和激活总是先使用纯净镜像进行安装，安装完成进入系统后再手动执行激活操作。MAS 提供了一个预激活（Windows Pre-Activation）的方法，能够在系统安装完成的同时自动执行激活操作。</p>
<p>操作流程也非常简单，同样打开 <code>All-In-One-Version</code> 目录中的 cmd 脚本，选择 <code>6</code> 进入其他功能选项菜单，再选择 <code>[2] Extract $OEM$ Folder</code> 即可进入到预激活文件选择界面，如下图所示：</p>
<p><figure><a class="lightgallery" href="https://s2.loli.net/2022/01/26/YZGpbhXgKOJDSyw.png" title="https://s2.loli.net/2022/01/26/YZGpbhXgKOJDSyw.png" data-thumbnail="https://s2.loli.net/2022/01/26/YZGpbhXgKOJDSyw.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://s2.loli.net/2022/01/26/YZGpbhXgKOJDSyw.png"
            loading="lazy"
            title="https://s2.loli.net/2022/01/26/YZGpbhXgKOJDSyw.png"
            alt="https://s2.loli.net/2022/01/26/YZGpbhXgKOJDSyw.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<p>这里我们选择 <code>[4] HWID &gt; KMS38</code>，它表示预激活先使用 HWID 方法，若激活失败，则降级到使用 KMS38（至于再次降级使用 Online KMS，个人认为没有必要），此时程序会在桌面上创建一个 <code>$OEM$</code> 目录，里面就包含了预激活脚本。</p>
<p>准备好 Windows ISO 纯净镜像，这里以 Win11 为例，打开 <a href="https://www.microsoft.com/en-us/software-download/windows11">官网</a>，按照下图所示即可完成下载：</p>
<p><figure><a class="lightgallery" href="https://s2.loli.net/2022/01/31/R1MmzOGAt5Q7CZw.png" title="https://s2.loli.net/2022/01/31/R1MmzOGAt5Q7CZw.png" data-thumbnail="https://s2.loli.net/2022/01/31/R1MmzOGAt5Q7CZw.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://s2.loli.net/2022/01/31/R1MmzOGAt5Q7CZw.png"
            loading="lazy"
            title="https://s2.loli.net/2022/01/31/R1MmzOGAt5Q7CZw.png"
            alt="https://s2.loli.net/2022/01/31/R1MmzOGAt5Q7CZw.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<p>使用 UltraISO、AnyBurn 等刻录工具打开你下载好的纯净 Windows ISO 镜像文件，将上述目录拷贝到镜像下的 <code>\sources</code> 目录，此时应该存在目录 <code>\sources\$OEM$</code>，记得保存，如下图所示：</p>
<p><figure><a class="lightgallery" href="https://i.loli.net/2021/10/24/G9EOzgTNjU75yhf.png" title="https://i.loli.net/2021/10/24/G9EOzgTNjU75yhf.png" data-thumbnail="https://i.loli.net/2021/10/24/G9EOzgTNjU75yhf.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://i.loli.net/2021/10/24/G9EOzgTNjU75yhf.png"
            loading="lazy"
            title="https://i.loli.net/2021/10/24/G9EOzgTNjU75yhf.png"
            alt="https://i.loli.net/2021/10/24/G9EOzgTNjU75yhf.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<p>至此，我们完成了预激活镜像的制作。</p>
<p>我在虚拟机进行了测试，使用刚制作好的预激活镜像进行系统安装（Win11 的安装需要联网并且登录微软账号），安装成功后，系统已是激活状态：</p>
<p><figure><a class="lightgallery" href="https://i.loli.net/2021/10/24/ifPvXcRoaZwQ7G2.png" title="https://i.loli.net/2021/10/24/ifPvXcRoaZwQ7G2.png" data-thumbnail="https://i.loli.net/2021/10/24/ifPvXcRoaZwQ7G2.png">
        <img
            class="lazy"
            src="/svg/loading.min.svg"
            data-src="https://i.loli.net/2021/10/24/ifPvXcRoaZwQ7G2.png"
            loading="lazy"
            title="https://i.loli.net/2021/10/24/ifPvXcRoaZwQ7G2.png"
            alt="https://i.loli.net/2021/10/24/ifPvXcRoaZwQ7G2.png" />
    </a><figcaption class="image-caption"></figcaption>
</figure>
</p>
<hr>
<h2 id="安全">安全<a hidden class="anchor" aria-hidden="true" href="#安全">#</a></h2>
<p>MAS 提供了一份项目中使用到的所有不可读文件的病毒检测报告（检测平台：Virus Total）：</p>
<div class="details admonition success open">
        <div class="details-summary admonition-title">
            <i class="icon fas fa-check-circle fa-fw"></i>Virus Total Report<i class="details-icon fas fa-angle-right fa-fw"></i>
        </div>
        <div class="details-content">
            <div class="admonition-content"><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">fabb5a0fc1e6a372219711152291339af36ed0b5 *gatherosstate.exe         Virus Total = 0/71
</span></span><span class="line"><span class="cl">ca3a51fdfc8749b8be85f7904b1c238a6dfba135 *slc.dll                   Virus Total = 0/68
</span></span><span class="line"><span class="cl">578364cb2319da7999acd8c015b4ce8da8f1b282 *ARM64_gatherosstate.exe   Virus Total = 0/69
</span></span><span class="line"><span class="cl">5dbea3a580cf60391453a04a5c910a3ceca2b810 *ARM64_slc.dll             Virus Total = 0/67
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>以下 exe 均为 Microsoft 官方提供的文件，因此即使检测报告数量不为 0，也并不用担心安全问题：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">48d928b1bec25a56fe896c430c2c034b7866aa7a *ClipUp.exe                Virus Total = 0/68
</span></span><span class="line"><span class="cl">d30a0e4e5911d3ca705617d17225372731c770e2 *cleanosppx64.exe          Virus Total = 0/66
</span></span><span class="line"><span class="cl">39ed8659e7ca16aaccb86def94ce6cec4c847dd6 *cleanosppx86.exe          Virus Total = 1/66
</span></span><span class="line"><span class="cl">9d5b4b3e761cca9531d64200dfbbfa0dec94f5b0 *_Info.txt                 Virus Total = 0/59
</span></span></code></pre></td></tr></table>
</div>
</div></div>
        </div>
    </div>
<hr>
<h2 id="总结">总结<a hidden class="anchor" aria-hidden="true" href="#总结">#</a></h2>
<ul>
<li>如果是最常用的个人电脑，推荐直接使用 HWID 方法，保证联网和 Windows Update Service 正常运行这两个条件即可。</li>
<li>如果是一些特殊版本（如 Server、Enterprise等），则可以使用 KMS38。</li>
<li>如果要激活 Office，可以使用 Online KMS。</li>
</ul>


  </div>

  <footer class="post-footer">
    <ul class="post-tags">
      <li><a href="https://www.liyangjie.cn/tags/windows-%E6%BF%80%E6%B4%BB/">Windows 激活</a></li>
    </ul><div id="post-licensing" class="admonition warning">
    <div class="details-summary admonition-title">
        版权声明 <a rel="license" target="_blank" href="https://creativecommons.org/licenses/by/4.0/deed.zh"><i class="fab fa-creative-commons"></i> <i class="fab fa-creative-commons-by"></i></a>
    </div>
    
    <div class="details-content">
        <div class="admonition-content">
            <ul>
                <li>本文作者：SadBird。</li>
                <li>本文链接：https://www.liyangjie.cn/posts/hobby/windows-activation/。</li>
                <li>许可说明：本站所有文章除特殊声明外，均使用 <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="license" target="_blank"><i class="fab fa-creative-commons"></i> <i class="fab fa-creative-commons-by"></i> CC BY 4.0 </a> 许可协议，转载请注明出处。</li>
            </ul>
        </div>
    </div>
</div>
<nav class="paginav">
  <a class="prev" href="https://www.liyangjie.cn/posts/work/spring-circular-dependency/">
    <span class="title"><i class="fas fa-angle-double-left"></i> Prev Page</span>
    <br>
    <span>Spring 循环依赖</span>
  </a>
  <a class="next" href="https://www.liyangjie.cn/posts/hobby/hugo-git-actions/">
    <span class="title">Next Page <i class="fas fa-angle-double-right"></i></span>
    <br>
    <span>Hugo 部署——Github Actions</span>
  </a>
</nav>

  </footer>
<footer class="tc-container" id="comment">
    <div class="tc-title"><p class="c-title">Discussion</p></div>
    <div id="tcomments"></div>
</footer>
<script crossorigin="anonymous" src="/js/twikoo.min.64322d6748f9b8b12dfb029616065f8eeed16467444adde58bab7d98c5733adf.js" integrity="sha256-ZDItZ0j5uLEt&#43;wKWFgZfju7RZGdESt3li6t9mMVzOt8="></script>
<script>
    twikoo.init({
        envId: 'https://twikoo-nu-red.vercel.app/',
        el: '#tcomments',
        region: 'ap-shenzhen', 
        
        lang: 'zh-CN', 
    });
</script>
</article>
    </main>
    
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
        <path d="M12 6H0l6-6z" />
    </svg>
</a><script>
    class Accordion {
        constructor(el) {
            
            this.el = el;
            
            this.summary = el.querySelector('summary');
            
            this.content = el.querySelector('.inner');

            
            this.animation = null;
            
            this.isClosing = false;
            
            this.isExpanding = false;
            
            this.summary.addEventListener('click', (e) => this.onClick(e));
        }

        onClick(e) {
            
            e.preventDefault();
            
            this.el.style.overflow = 'hidden';
            
            if (this.isClosing || !this.el.open) {
            this.open();
            
            } else if (this.isExpanding || this.el.open) {
            this.shrink();
            }
        }

        shrink() {
            
            this.isClosing = true;
            
            
            const startHeight = `${this.el.offsetHeight}px`;
            
            const endHeight = `${this.summary.offsetHeight}px`;
            
            
            if (this.animation) {
            
            this.animation.cancel();
            }
            
            
            this.animation = this.el.animate({
            
            height: [startHeight, endHeight]
            }, {
            duration: 400,
            easing: 'ease-out'
            });
            
            
            this.animation.onfinish = () => this.onAnimationFinish(false);
            
            this.animation.oncancel = () => this.isClosing = false;
        }

        open() {
            
            this.el.style.height = `${this.el.offsetHeight}px`;
            
            this.el.open = true;
            
            window.requestAnimationFrame(() => this.expand());
        }

        expand() {
            
            this.isExpanding = true;
            
            const startHeight = `${this.el.offsetHeight}px`;
            
            const endHeight = `${this.summary.offsetHeight + this.content.offsetHeight}px`;
            
            
            if (this.animation) {
            
            this.animation.cancel();
            }
            
            
            this.animation = this.el.animate({
            
            height: [startHeight, endHeight]
            }, {
            duration: 400,
            easing: 'ease-out'
            });
            
            this.animation.onfinish = () => this.onAnimationFinish(true);
            
            this.animation.oncancel = () => this.isExpanding = false;
        }

        onAnimationFinish(open) {
            
            this.el.open = open;
            
            this.animation = null;
            
            this.isClosing = false;
            this.isExpanding = false;
            
            this.el.style.height = this.el.style.overflow = '';
        }
    }

    document.querySelectorAll('.toc details').forEach((el) => {
        new Accordion(el);
    });
</script>
<a href="#comment" aria-label="go to bottom comment" title="Go to Bottom Comment (Alt + B)" class="top-link bottom-comment" id="bottom-comment" accesskey="b" style="visibility: visible; opacity: 1;">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 29.338 29.338" fill="currentcolor">
        <path d="M27.184,1.605H2.156C0.967,1.605,0,2.572,0,3.76v17.572c0,1.188,0.967,2.155,2.156,2.155h13.543
		l5.057,3.777c0.414,0.31,0.842,0.468,1.268,0.468c0.789,0,1.639-0.602,1.637-1.923v-2.322h3.523c1.188,0,2.154-0.967,2.154-2.155
		V3.76C29.338,2.572,28.371,1.605,27.184,1.605z M27.34,21.332c0,0.085-0.068,0.155-0.154,0.155h-5.523v3.955l-5.297-3.956H2.156
		c-0.086,0-0.154-0.07-0.154-0.155V3.759c0-0.085,0.068-0.155,0.154-0.155v0.001h25.029c0.086,0,0.154,0.07,0.154,0.155
		L27.34,21.332L27.34,21.332z M5.505,10.792h4.334v4.333H5.505C5.505,15.125,5.505,10.792,5.505,10.792z M12.505,10.792h4.334v4.333
		h-4.334V10.792z M19.505,10.792h4.334v4.333h-4.334V10.792z"/>
    </svg>
</a>

<script>
    let comment = document.getElementById("comment");
    let bottomToComment = document.getElementById("bottom-comment")
    
    document.addEventListener('scroll',function () {
        const viewPortHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight 
        const offsetTop = comment.offsetTop
        const scrollTop = document.documentElement.scrollTop
        const top = offsetTop - scrollTop
        if (top <= viewPortHeight + 100) {
            bottomToComment.style.visibility = "hidden";
            bottomToComment.style.opacity = "0";
        } else {
            bottomToComment.style.visibility = "visible";
            bottomToComment.style.opacity = "1";
        }
    })
</script><footer class="footer">
    <span>&copy; 2022 <a href="https://www.liyangjie.cn/">染竹君的个人博客</a></span>
    <span>
        Powered by
        <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
        <a href="https://git.io/hugopapermod" rel="noopener" target="_blank">PaperMod</a>
    </span>
    
</footer>

<script crossorigin="anonymous" src="/js/intersection-observer.min.c0ff09623e9f209a66c6130004e0422e1385fd8e8f8baaa14246a49c19827c68.js" integrity="sha256-wP8JYj6fIJpmxhMABOBCLhOF/Y6Pi6qhQkaknBmCfGg="></script>
<script crossorigin="anonymous" src="/js/lazyload.min.min.53e82bf9e8c145b953635b17fa3911ab6f3a8f1e4d37969aeb39d829d30fa6e9.js" integrity="sha256-U&#43;gr&#43;ejBRblTY1sX&#43;jkRq286jx5NN5aa6znYKdMPpuk="></script>


<script crossorigin="anonymous" src="/js/lightgallery.min.5d1410b8c831852c6c62b2dfad75f4e0f046a13e1826f97cd7a742523fab608c.js" integrity="sha256-XRQQuMgxhSxsYrLfrXX04PBGoT4YJvl816dCUj&#43;rYIw="></script>
<script crossorigin="anonymous" src="/js/lg-thumbnail.min.afa3995936244c14f68b85b13d657c368dc787cbcea863179950ac494dab6117.js" integrity="sha256-r6OZWTYkTBT2i4WxPWV8No3Hh8vOqGMXmVCsSU2rYRc="></script>
<script crossorigin="anonymous" src="/js/lg-zoom.min.a47b38d6f7138dce5f712f77780f339b5ec26af3bcd44950bcf736754ec88ed4.js" integrity="sha256-pHs41vcTjc5fcS93eA8zm17CavO81ElQvPc2dU7IjtQ="></script>
<script>
    const lazyLoadInstance = new LazyLoad({
        
    }); 
    
    const config = {
        selector: ".lightgallery",
        mode: "lg-slide",
        plugins: [lgZoom, lgThumbnail],
        speed: 400,
        hideBarsDelay: 2000,
        mousewheel: true,
        thumbnail: true,
        exThumbImage: "data-thumbnail",
        thumbWidth: 80,
        thumbContHeight: 80,
        mobileSettings: { controls: true, showCloseIcon: true, download: true, },
        licenseKey: "28AC9E09-3D8C45D8-8D6124E0-8FF74FF3", 
    };

    lightGallery(document.getElementsByClassName('post-content')[0], config);
</script>
<script>
    let details = document.getElementsByClassName('details')
    details = details || [];
    for (let i = 0; i < details.length; i++) {
        let element = details[i]
        const summary = element.getElementsByClassName('details-summary')[0];
        if (summary) {
            summary.addEventListener('click', () => {
                element.classList.toggle('open');
            }, false);
        }
    }
</script>

<script>
    let menu = document.getElementById('menu')
    if (menu) {
        menu.scrollLeft = localStorage.getItem("menu-scroll-position");
        menu.onscroll = function () {
            localStorage.setItem("menu-scroll-position", menu.scrollLeft);
        }
    }

    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
        anchor.addEventListener("click", function (e) {
            e.preventDefault();
            var id = this.getAttribute("href").substr(1);
            if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
                    behavior: "smooth"
                });
            } else {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
            }
            if (id === "top") {
                history.replaceState(null, null, " ");
            } else {
                history.pushState(null, null, `#${id}`);
            }
        });
    });

</script>
<script>
    var mybutton = document.getElementById("top-link");
    window.onscroll = function () {
        if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
            mybutton.style.visibility = "visible";
            mybutton.style.opacity = "1";
        } else {
            mybutton.style.visibility = "hidden";
            mybutton.style.opacity = "0";
        }
    };

</script>
<script>
    document.getElementById("theme-toggle").addEventListener("click", () => {
        if (document.body.className.includes("dark")) {
            document.body.classList.remove('dark');
            localStorage.setItem("pref-theme", 'light');
        } else {
            document.body.classList.add('dark');
            localStorage.setItem("pref-theme", 'dark');
        }
    })

</script>
<script>
    document.querySelectorAll('pre > code').forEach((codeblock) => {
        const container = codeblock.parentNode.parentNode;

        const copybutton = document.createElement('button');
        copybutton.classList.add('copy-code');
        copybutton.innerHTML = 'copy';

        function copyingDone() {
            copybutton.innerHTML = 'copied!';
            setTimeout(() => {
                copybutton.innerHTML = 'copy';
            }, 2000);
        }

        copybutton.addEventListener('click', (cb) => {
            if ('clipboard' in navigator) {
                navigator.clipboard.writeText(codeblock.textContent);
                copyingDone();
                return;
            }

            const range = document.createRange();
            range.selectNodeContents(codeblock);
            const selection = window.getSelection();
            selection.removeAllRanges();
            selection.addRange(range);
            try {
                document.execCommand('copy');
                copyingDone();
            } catch (e) { };
            selection.removeRange(range);
        });

        if (container.classList.contains("highlight")) {
            container.appendChild(copybutton);
        } else if (container.parentNode.firstChild == container) {
            
        } else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
            
            codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
        } else {
            
            codeblock.parentNode.appendChild(copybutton);
        }
    });
</script>


<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [['$','$'], ['\\(','\\)']],
        processEscapes: true
      }
    });
</script>

<script type="text/javascript"
  src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script></body>

</html>